using System;
using HeadFirstDesignPatterns.Command.RemoteControl;
using NUnit.Framework;

namespace HeadFirstDesignPatterns.DeveloperTests.Command.RemoteControl
{
	/// <summary>
	/// CommandRemoteControlFixture tests the command pattern
	/// </summary>
	[TestFixture]
	public class CommandRemoteControlFixture
	{
		#region TestTurningSimpleOn
		[Test]
		public void TestTurningSimpleOn()//Command Pattern Client
		{
			//Command Pattern Invoker
			SimpleRemoteControl remote = new SimpleRemoteControl();

			//Command Pattern Receivers
			Light light = new Light("Kitchen");
			GarageDoor garageDoor = new GarageDoor("");

			//Commands for the receivers
			LightOnCommand lightOn = new LightOnCommand(light);
			GarageDoorUpCommand garageDoorOpen = 
				new GarageDoorUpCommand(garageDoor);
			
			//Passing the light on command to the invoker
			remote.SetCommand(lightOn);
			//Simulate the button being pressed on the invoker
			Assert.AreEqual("Kitchen light is on",remote.ButtonWasPressed());

			//Passing the garage door open command to the invoker
			remote.SetCommand(garageDoorOpen);
			//Simulate the button being pressed on the invoker
			Assert.AreEqual("Garage door is up",remote.ButtonWasPressed());
		}
		#endregion//TestTurningSimpleOn

		#region TestTurningOn
		[Test]
		public void TestTurningOn()//Command Pattern Client
		{
			//Command Pattern Invoker
			Remote remote = new Remote();

			Light livingRoomLight = new Light("Living Room");
			Light kitchenLight = new Light("Kitchen");
			CeilingFan ceilingFan= new CeilingFan("Living Room");
			GarageDoor garageDoor = new GarageDoor("");
			Stereo stereo = new Stereo("Living Room");
  
			LightOnCommand livingRoomLightOn = 
				new LightOnCommand(livingRoomLight);
			LightOffCommand livingRoomLightOff = 
				new LightOffCommand(livingRoomLight);
			LightOnCommand kitchenLightOn = 
				new LightOnCommand(kitchenLight);
			LightOffCommand kitchenLightOff = 
				new LightOffCommand(kitchenLight);
  
			CeilingFanOnCommand ceilingFanOn = 
				new CeilingFanOnCommand(ceilingFan);
			CeilingFanOffCommand ceilingFanOff = 
				new CeilingFanOffCommand(ceilingFan);
 
			GarageDoorUpCommand garageDoorUp =
				new GarageDoorUpCommand(garageDoor);
			GarageDoorDownCommand garageDoorDown =
				new GarageDoorDownCommand(garageDoor);
 
			StereoOnWithCDCommand stereoOnWithCD =
				new StereoOnWithCDCommand(stereo);
			StereoOffCommand  stereoOff =
				new StereoOffCommand(stereo);
 
			remote.SetCommand(0, livingRoomLightOn, livingRoomLightOff);
			remote.SetCommand(1, kitchenLightOn, kitchenLightOff);
			remote.SetCommand(2, ceilingFanOn, ceilingFanOff);
			remote.SetCommand(3, stereoOnWithCD, stereoOff);
  
			Assert.AreEqual("Living Room light is on",
				remote.OnButtonWasPushed(0));
			Assert.AreEqual("Living Room light is off",
				remote.OffButtonWasPushed(0));

			Assert.AreEqual("Kitchen light is on",
				remote.OnButtonWasPushed(1));
			Assert.AreEqual("Kitchen light is off",
				remote.OffButtonWasPushed(1));
			Assert.AreEqual("Living Room ceiling fan is on high",
				remote.OnButtonWasPushed(2));
			Assert.AreEqual("Living Room ceiling fan is off",
				remote.OffButtonWasPushed(2));
			Assert.AreEqual("Living Room stereo is on\n" +
				"Living Room stereo is set for CD input\n" +
				"Living Room Stereo volume set to 11",
				remote.OnButtonWasPushed(3));
			Assert.AreEqual("Living Room stereo is off",
				remote.OffButtonWasPushed(3));

//			Console.WriteLine(remote.toString());
		}
		#endregion
	}
}